package com.leapcloud.crm.core.dao;

import com.leapcloud.crm.core.builder.Page;
import com.leapcloud.crm.core.builder.WhereCondition;
import com.leapcloud.crm.core.model.PageInfo;
import org.jooq.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * @author wangzhenyan
 * @email ffu@maxleap.com
 * @since 2018/8/29 13:46
 */
public interface BaseDao<T, R extends Record> {
  Logger log = LoggerFactory.getLogger(BaseDao.class);

  DSLContext dsl();

  /**
   * select 合成方法， 包含是否删除条件
   *
   * @return
   */
  SelectConditionStep<R> select();

  /**
   * 查询返回指定字段
   *
   * @param selectFields
   * @return
   */
  SelectConditionStep<?> select(SelectField... selectFields);

  /**
   * 根据查询条件
   * 查询返回指定字段
   *
   * @param condition
   * @param selectFields
   * @return
   */
  SelectConditionStep<?> select(Condition condition, SelectField... selectFields);

  /**
   * 返回自定义模型 当条数据
   *
   * @param condition
   * @param targetClass
   * @param selectFields
   * @param <E>
   * @return
   */
  <E> E find(Condition condition, Class<E> targetClass, SelectField... selectFields);

  /**
   * 获取当条数据
   *
   * @param condition
   * @param selectFields
   * @return
   */
  T find(Condition condition, SelectField... selectFields);

  /**
   * update 合成方法， 包含是否删除条件
   *
   * @return
   */
  UpdateConditionStep<R> update(T entity);

  /**
   * 添加数据
   *
   * @param entity
   * @return
   */
  T create(T entity);

  /**
   * 查询一条记录
   *
   * @param id
   * @return
   */
  T find(Long id);

  /**
   * 按照条件查询
   *
   * @param whereCondition
   * @return
   */
  List<T> findList(WhereCondition whereCondition);

  /**
   * 按照条件查询
   *
   * @param condition
   * @return
   */
  List<T> findList(Condition condition);

  /**
   * 查询数据
   *
   * @param limit
   * @return
   */
  List<T> findList(int limit);

  /**
   * 按照条件查询
   *
   * @param condition
   * @param limit
   * @return
   */
  List<T> findList(Condition condition, int limit);

  /**
   * 删除数据 可恢复
   *
   * @param id
   * @return
   */
  int remove(Long id);

  /**
   * 批量删除数据
   *
   * @param id
   * @return
   */
  int removes(List<Long> ids);

  /**
   * 批量删除数据
   *
   * @param ids
   * @return
   */
  int removes(Long... ids);

  /**
   * 删除数据，无法恢复
   *
   * @param ids
   * @return
   */
  int delete(Long id);

  /**
   * 更新数据
   *
   * @param entity
   * @return
   */
  T modify(T entity);

  PageInfo<T> findPage(Page page);

}
